package com.example.toy.core.locker;

import com.example.toy.core.table.TableIdentifier;
import com.example.toy.core.version.ToyVersion;
import org.apache.hadoop.fs.Path;

/**
 * ToyLockFactory
 *
 * @author shenbing
 * @date 2021/12/22
 */
public abstract class ToyLockAbstractFactory {

  /**
   * 创建表锁
   *
   * <p>这个方法，可以在表不存在时，直接创建表锁
   *
   * <p>对于不同的实现，tableIdentifier和basePath有时只要提供一个即可
   *
   * @param tableIdentifier
   * @param basePath
   * @return
   */
  public abstract ToyLock buildTableLock(TableIdentifier tableIdentifier, Path basePath);

  /**
   * 获取分区锁
   *
   * <p>这个方法，可以在分区文件不存在时，直接创建分区锁
   *
   * <p>对于不同的实现，tableIdentifier + partitionKey 和 partitionPath 有时只要提供一种即可
   *
   * @param tableIdentifier
   * @param partitionKey
   * @param partitionPath
   * @return
   */
  public abstract ToyLock buildPartitionLock(
      TableIdentifier tableIdentifier, String partitionKey, Path partitionPath);

  /**
   * 版本锁
   *
   * 在并发执行某些操作，例如compact合并历史记录，如果某个版本正在执行归档任务，<br/>
   * 那么该版本就会上锁，而compact只能对小于上锁版本的历史记录进行合并
   * @param tableIdentifier
   * @param version
   * @return
   */
  public abstract ToyLock buildVersionLock(TableIdentifier tableIdentifier, ToyVersion version);
}
